Acme::Oil - Oil is slippery and combustible.


Acme-Oil documentation Contained in the Acme-Oil distribution.

Index


Code Index:

NAME

Top

Acme::Oil - Oil is slippery and combustible.

SYNOPSIS

Top

 use Acme::Oil;

 my $var = 'thing';

 Acme::Oil::can($var); #  this is oily.

 print $var;   # it is not likely to be able to take it out by slipping.

 $var = 'eel'; # it is not likely to be able to put in by slipping.

 $var = 'fire'; # No! Don't bring the fire!  ...Bom!

 print $var; # ashed.

 


 my $var2 = 'Firefox'; # burning.

 Acme::Oil::can($var); # silly!  ...Bom!

 Acme::Oil::can(); # doesn't remain any longer.







DESCRIPTION

Top

There are two educational effects of this module. First, if the variable is soaked in oil, it becomes slippery. Second, it is dangerous to bring the fire close to the oil. Please remembere these points, enjoy your Perl life!

FUNCTIONS

Top

Acme::Oil::can

It takes a scalar or an array or a hash(not yet supported). If no argument, returns amount of the remainder.

Acme::Oil::wipe

It takes a scalar or an array or a hash(not yet supported) and wiped oil off.

WARNING

Top

 use warnings 'ACME::Oil';

 no warnings 'ACME::Oil';

TODO

Top

should support HASH.

AUTHOR

Top

Makamaka Hannyaharamitu, <makamaka[at]cpan.org>

COPYRIGHT AND LICENSE

Top

SEE ALSO

Top

Tie


Acme-Oil documentation Contained in the Acme-Oil distribution.

package Acme::Oil;
##############################################################################

use strict;
use warnings;
use warnings::register;
use Carp;
use vars qw($VERSION);

my $Level = 100; # remainder

$VERSION= 0.1;
##############################################################################

sub can (;\[$@%]){ #  UNIVERSAL::can is overloaded!

	return $Level unless(@_ > 0);

	return 0      if(!$Level); # oil can is empty!

	if( is_this_burning($_[0]) ){
		ignition($_[0]);
		$Level = 0;
	}
	else{
		soak( $_[0] );
		--$Level;
	}

	$Level;
}


sub wipe (\[$@%]) {
	if(ref($_[0]) eq 'SCALAR'){
		untie ${$_[0]};
	}
	elsif(ref($_[0]) eq 'ARRAY'){
		untie @{$_[0]};
	}
	elsif(ref($_[0]) eq 'HASH'){
		untie %{$_[0]};
	}
	else{
		croak "Sorry, not support it.";
	}
}


sub soak {
	if(ref($_[0]) eq 'SCALAR'){
		require Acme::Oil::ed::Scalar;
		tie ${$_[0]}, 'Acme::Oil::ed::Scalar', ${$_[0]};
	}
	elsif(ref($_[0]) eq 'ARRAY'){
		#croak "Sorry, not yet implemented.";
		require Acme::Oil::ed::Array;
		tie @{$_[0]}, 'Acme::Oil::ed::Array', @{$_[0]};
	}
	elsif(ref($_[0]) eq 'HASH'){
		croak "Sorry, not yet implemented.";
		#tie ${$_[0]}, 'Acme::Oil::ed::HASH', ${$_[0]};
	}
	else{
		croak "Sorry, not support it.";
	}
}


sub is_this_burning {
	my $ref = shift || return 0;

	if(ref($ref) eq 'SCALAR'){
		return _is_burning($$ref);
	}
	elsif(ref($ref) eq 'ARRAY'){
		for my $value (@$ref){
			if(_is_burning($value)){ return 1; }
		}
		return 0;
	}
}


sub _is_burning {
	my $value = shift;
	return 0 unless(defined $value);
	return 1 if $value =~ /fire/i;
}


sub ignition {

	carp "Don't bring the fire close!  ...Bom!"
	  if(warnings::enabled('Acme::Oil'));

	if(ref($_[0]) eq 'SCALAR'){
		require Acme::Oil::Ashed::Scalar;
		tie ${$_[0]}, 'Acme::Oil::Ashed::Scalar';
	}
	elsif(ref($_[0]) eq 'ARRAY'){
		require Acme::Oil::Ashed::Array;
		tie @{$_[0]}, 'Acme::Oil::Ashed::Array';
	}
}

##############################################################################
1;
__END__