|
NAMEClass::OOorNO - Give your module classic AND OO interfacesSTATUS!This is a developer's release, and is not intended for use in the public sector. This code is made available for developers who wish to aid in the furthering of the code.This is not a registered module in the CPAN module list. It is not part of the CPAN yet. SYNOPSIS
PURPOSEAllows you set up your module so it can easily provide a standard interface as well as an object-oriented interface to its users.DESCRIPTIONClass::OOorNO helps your module handle the input for its subroutines whether called in object-oriented style (as object methods or class methods with the arrow syntax "->"), or in functional programming style (as subroutines imported to the caller's namespace via Exporter).The bulk of this module comprises a lightweight, pure-Perl emulation of the Devel::Caller library's "called_as_method()" routine which is written in C. Devel::Caller dives deep into the internals of of the Perl interpreter (see perlguts) to trace stack frames and can get the input for any call in the stack. It's really handy for Devel::opment and debugging. This module is much more lightweight and focuses more on your module's Class:: methods themselves. EXPORTNone by default.EXPORT_OKAll available methods. (see METHODS below)EXPORT_TAGS":all" (exports all of @EXPORT_OK)METHODS"myself()"
"OOorNO()"
"myargs()"
package Your::Class; use Class::OOorNO qw( myargs ); sub bar { my(@args) = myargs(@_); ... -OR- package Your::Class; use Class::OOorNO; our($onobj) = Class::OOorNO->new(); sub foo { my(@args) = $onobj->myargs(@_); ... "coerce_array()"
Warnings (see perldiag) resulting from the above mentioned situations could include any the following (Some of these don't apply unless you run your program under the warnings pragma) like you should.
"shave_opts()"
EXAMPLESNote: This is not a complete set of examples. It's still evolving.using "OOorNO()"Your module...package Your::Module; use strict; use Exporter; use vars qw( @EXPORT_OK ); @EXPORT_OK = qw( show_call_style ); use Class::OOorNO qw( OOorNO ); sub new { bless { }, shift } sub show_call_style { if (ref OOorNO(@_)) { print __PACKAGE__ . "::foo was called as an OBJECT METHOD.\n" } elsif (OOorNO(@_)) { print __PACKAGE__ . "::foo was called as an CLASS METHOD.\n" } else { print __PACKAGE__ . "::foo was called as a SUBROUTINE.\n" } } User's code... package main; use strict; use Your::Module qw( show_call_style ); my($YM) = Your::Module->new; $YM->show_call_style; # as an object method Your::Module->show_call_style; # as a class method &Your::Module::show_call_style; # as a subroutine &show_call_style; # as imported subroutine Output: Your::Module::foo was called as an OBJECT METHOD. Your::Module::foo was called as an CLASS METHOD. Your::Module::foo was called as a SUBROUTINE. Your::Module::foo was called as a SUBROUTINE. using "myself()"Your module...package Your::Module; use strict; use Exporter; use vars qw( @EXPORT_OK ); @EXPORT_OK = qw( print_self_name ); use Class::OOorNO qw( myself ); sub new { bless { }, shift } sub print_self_name { print( (ref myself(@_) || myself(@_) || __PACKAGE__), "\n" ) } User's code... package main; use strict; use Your::Module qw( print_self_name ); my($YM) = Your::Module->new; $YM->print_self_name; # as an object method Your::Module->print_self_name; # as a class method &Your::Module::print_self_name; # as a subroutine print_self_name; # as imported subroutine Output: Your::Module Your::Module Your::Module Your::Module Your module... package Your::Module; use strict; use Exporter; use vars qw( @EXPORT_OK ); @EXPORT_OK = qw( show_call_style get_self_ref ); use Class::OOorNO qw( OOorNO myself ); sub new { bless { }, shift } sub show_call_style { if (ref OOorNO(@_)) { print __PACKAGE__ . "::foo was called as an OBJECT METHOD.\n" } elsif (OOorNO(@_)) { print __PACKAGE__ . "::foo was called as an CLASS METHOD.\n" } else { print __PACKAGE__ . "::foo was called as a SUBROUTINE.\n" } } sub get_self_ref { ref myself(@_) ? myself(@_) : __PACKAGE__->new } User's code... package main; use strict; use Your::Module qw( show_call_style get_self_ref ); my($YM) = Your::Module->new; # supports calls that go way down the stack too: Your::Module->new->get_self_ref->show_call_style; Your::Module->get_self_ref->show_call_style; &Your::Module::get_self_ref->show_call_style; get_self_ref->show_call_style; Output: Your::Module::foo was called as an OBJECT METHOD. Your::Module::foo was called as an OBJECT METHOD. Your::Module::foo was called as an OBJECT METHOD. Your::Module::foo was called as an OBJECT METHOD. using "myargs()"Your module...package Your::Module; use strict; use Exporter; use vars qw( @EXPORT_OK ); @EXPORT_OK = qw( print_argument_list ); use Class::OOorNO qw( myargs ); sub new { bless { }, shift } sub print_argument_list { print "My argument list: \n" . join("\n", myargs(@_)), "\n"; } User's code... package main; use strict; use Your::Module qw( print_argument_list ); my($YM) = Your::Module->new; my(@things) = ( 'foo', 12687.357, $YM, eval('*bar'), [ 'baz', sub { "wubble" }, { 'flarp' => 'wibble' } ] ); $YM->print_argument_list(@things); # as an object method Your::Module->print_argument_list(@things); # as a class method &Your::Module::print_argument_list(@things); # as a subroutine print_argument_list(@things); # as imported subroutine Output: My argument list: foo 12687.357 Your::Module=HASH(0x9bd858) *main::bar ARRAY(0x9bd954) ...repeated four times using "coerce_array()"Your module...package Your::Module; use strict; use Exporter; use vars qw( @EXPORT_OK ); @EXPORT_OK = qw( pass_name_value_pairs ); use Class::OOorNO qw( coerce_array ); sub new { bless { }, shift } sub pass_name_value_pairs { my($input) = coerce_array(@_); my($driver) = $input->{'-driver'} || 'nobody'; my($car) = $input->{'-car'} || 'no car'; my($bike) = $input->{'-bike'} || 'no bike'; my($plane) = $input->{'-plane'} || 'no plane'; print("$driver drives $car, $bike, and $plane.\n"); } User's code... Output: using "shave_opts()"Your module...package Your::Module; use strict; use Exporter; use vars qw( @EXPORT_OK ); @EXPORT_OK = qw( print_options ); use Class::OOorNO qw( shave_opts ); sub new { bless { }, shift } sub print_options { my($opts) = shave_opts(\@_); print "\n", ( map { qq[$_ => $opts->{$_}] . "\n" } keys %$opts ), "\n" } User's code... Output: PREREQUISITESNone.BUGSThis documentation isn't done yet, as you can see. This is being rectified as quickly as possible. Please excercise caution if you choose to use this code before it can be further documented for you. It is present on CPAN at this time despite its unfinished condition in order to provide support for the File::Util module which lists Class::OOorNO among its prerequisites. Please excuse the inconvenience.AUTHORTommy Butler <cpan@atrixnet.com <mailto:cpan@atrixnet.com>>COPYRIGHTCopyright(c) 2001-2003, Tommy Butler. All rights reserved.LICENSEThis library is free software, you may redistribute and/or modify it under the same terms as Perl itself.SEE ALSO
Visit the GSP FreeBSD Man Page Interface. |