in reply to Package-specific Attribute Handling and Multiple Inheritence

I've been wrestling mentally with this same issue for improving Object::LocalVars. The best thing I've come up with it rewriting my attributes to use Attribute::Handlers, which provides the MODIFY_CODE_ATTRIBUTES subroutine and farms out the actual attributes found to other subroutines that registered themselves with Attribute::Handlers. This, of course, requires everyone to play nice and all use Attribute::Handlers as well.

I avoided Attribute::Handlers at first because of the complexity within it -- I wanted more direct control of the attribute handling process to be sure I understood what was happening. But for interoperability, I think it's the right way to go. However, Attribute::Handlers tries to do a lot of stuff in the CHECK phase by default, and that will break under mod_perl. I believe that Attribute::Handlers will allow one to force handling to be immediate in the BEGIN phase, which I what I intend to explore as an approach.

-xdg

Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.

Replies are listed 'Best First'.
Re^2: Package-specific Attribute Handling and Multiple Inheritence
by Thilosophy (Curate) on Sep 07, 2005 at 01:51 UTC
    Thanks, I have started looking at Attribute::Handlers myself in the meantime. It does look a little scary inside, but I guess that cannot be avoided when dealing with attributes, and as you say, with its centralized handler that just dispatches to the actual attribute handlers it is quite interoperable when many modules try to register attributes.

    Since this is for CGI::Application, it would have to play nice with mod_perl, though ... (I have recently even had a bug report from someone using Apache::Reload, which makes things even more tricky)

      Just make sure your handlers all run in the BEGIN phase. That will limit some of what you can do with them -- for example, you can get the name of a subroutine, but the code reference won't yet be defined. But that's no different than writing your own attribute handling code, so you've probably already dealt with it.

      -xdg

      Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.