Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw

Re: Refactoring Perl #8 - Replace Method with Method Object

by jdporter (Paladin)
on Nov 14, 2007 at 15:43 UTC ( [id://650774]=note: print w/replies, xml ) Need Help??

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

I was slightly disappointed that you didn't implement Validator as a true method object. It would be possible to do so using overloading, or, more clumsily, blessed subs. In fact, your example doesn't demonstrate much advantage to having Validator be a class at all; it could almost as well have been a simple package containing some subroutines.

  • Comment on Re: Refactoring Perl #8 - Replace Method with Method Object

Replies are listed 'Best First'.
Re^2: Refactoring Perl #8 - Replace Method with Method Object
by agianni (Hermit) on Nov 16, 2007 at 14:18 UTC

    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));'

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://650774]
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others about the Monastery: (3)
As of 2024-04-24 05:25 GMT
Find Nodes?
    Voting Booth?

    No recent polls found