http://www.perlmonks.org?node_id=651210


in reply to Re: Refactoring Perl #8 - Replace Method with Method Object
in thread Refactoring Perl #8 - Replace Method with Method Object

Interesting, I was unaware of such a formal definition of a method object; I was simply following Fowler's lead. I'm not sure he was referring to method objects in that sense. Now that you bring it up, though, that's an interesting programming concept. Looking around, I found this interesting paper on the topic of writing functors in Perl. I imagine that Class::Prototyped would be useful in implementing this in Perl

Like Fowler's example, though, mine is also probably too simple to show the usefulness of this refactoring pattern, under which the use of a functor or the like would actually be useful. As I go through Fowler's refactoring patterns, I find that many of them are perfectly applicable to non-OO Perl. In fact, the example I gave in my follow-up about CPAN modules does just that.

I most often employ this pattern when I am trying to avoid the blob anti-pattern and I want to get a bunch of related methods out of my class. It can also be useful if I'm working in an OO framework and I want to swap in a different class. I would implement it like this:

sub some_method{ return shift->that_package()->new(); }

and later:

sub that_package{ return 'Some::Package'; }

Then when I'm sub-classing in my framework, I can override package to provide the name of the package I want to actually use. This will generally be a sub-class or sibling of Some::Package and have the same interface.

perl -e 'split//,q{john hurl, pest caretaker}and(map{print @_[$_]}(joi +n(q{},map{sprintf(qq{%010u},$_)}(2**2*307*4993,5*101*641*5261,7*59*79 +*36997,13*17*71*45131,3**2*67*89*167*181))=~/\d{2}/g));'