Show
Ignore:
Timestamp:
03/30/09 00:04:44 (6 years ago)
Author:
kokogiko
Message:

tag 0.0.4

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/Geo-Direction-Name/trunk/lib/Geo/Direction/Name.pm

    r21013 r31677  
    55use Carp; 
    66 
    7 use version; our $VERSION = qv('0.0.3'); 
     7use version; our $VERSION = qv('0.0.4'); 
    88use Scalar::Util qw(looks_like_number); 
    99use Class::Inspector; 
     
    1919 
    2020sub new { 
    21     my $class  = shift; 
    22     my $locale = shift || "en_US"; 
     21    my ( $class, $opt ) = @_; 
    2322 
    2423    my $self = bless {}, $class; 
    2524 
    26     $self->locale($locale); 
     25    my $spec; 
     26    my $locale; 
     27    if ( $opt && ref($opt) ) { 
     28        $spec   = $opt->{spec}; 
     29        $locale = $opt->{locale}; 
     30    } else { 
     31        # For backward compatibility 
     32        $locale = $opt; 
     33    } 
     34 
     35    $self->spec(   $spec ); 
     36    $self->locale( $locale ); 
    2737 
    2838    $self; 
    2939} 
    3040 
     41sub spec   { 
     42    my $self   =   shift; 
     43    my $spec   =   shift; 
     44    my $noerr  =   shift; 
     45    my $errstr =   "Specification class(subclass of Geo::Direction::Name::Spec) must be set"; 
     46    $spec      ||= 'default' unless ( $self->{spec} ); 
     47     
     48    if ( $spec ) { 
     49        $errstr = "Geo::Direction::Name not support this specification now: " . $spec; 
     50        delete $self->{spec}; 
     51        my $class = __PACKAGE__ . '::Spec' . ( $spec eq 'default' ? '' : '::' . ucfirst($spec) ) ; 
     52        if( Class::Inspector->loaded($class) || $class->require ) { 
     53            $self->{spec} = $class->new; 
     54        } 
     55    } 
     56 
     57    croak $errstr unless ( $noerr || $self->{spec} ); 
     58    $self->{spec}; 
     59} 
     60 
    3161sub locale { 
    32     my $self = shift; 
    33     if ($_[0]) { 
    34         my $locale = Geo::Direction::Name->load($_[0]); 
    35  
    36         croak("Geo::Direction::Name not support this locale now: " . $_[0]) unless ($locale); 
    37  
    38         $self->{locale} = $locale; 
    39     } 
    40  
    41     $self->{locale}; 
     62    my $self   = shift; 
     63 
     64    $self->spec->locale( @_ ); 
    4265} 
    4366  
    4467sub to_string   { 
    4568    my $self      = shift; 
    46     my $direction = shift; 
    47     my $option    = shift || {}; 
    48  
    49     my $abbr      = defined($option->{abbreviation}) ? $option->{abbreviation} : 1; 
    50     my $devide    = $option->{devide} || 8; 
    51  
    52     croak ("Direction value must be a number") unless (looks_like_number($direction)); 
    53     croak ("Abbreviation parameter must be 0 or 1") if ( $abbr !~ /^[01]$/ ); 
    54     my $log2 = log($devide)/log(2); 
    55     croak ("Devide parameter must be 4, 8, 16 or 32") if ( $log2 !~ /^[2345]$/ ); 
    56  
    57     $direction   += 180 / $devide; 
    58  
    59     while ($direction < 0.0 || $direction >= 360.0) { 
    60         $direction +=  $direction < 0 ? 360.0 : -360.0; 
    61     } 
    62  
    63     my $i = int($direction * $devide / 360) * (32 / $devide); 
    64  
    65     $self->locale->string($i,$abbr); 
     69 
     70    $self->spec->to_string( @_ ); 
    6671} 
    6772 
    6873sub from_string { 
    6974    my $self      = shift; 
    70     my $string    = shift; 
    71  
    72     $self->locale->direction($string); 
    73 } 
    74  
    75 sub load { 
    76     my $class  = shift; 
    77     my $locale = shift; 
    78  
    79     ($locale)  = split(/\./,$locale); 
    80     my ($lang) = split(/_/,$locale); 
    81  
    82     foreach my $class (map { "Geo::Direction::Name::Locale::" . $_ } ($locale, $lang)) { 
    83         if( Class::Inspector->loaded($class) || $class->require) { 
    84             return $class->new; 
    85         } 
    86     } 
    87     return; 
    88 } 
     75 
     76    $self->spec->from_string( @_ ); 
     77} 
     78 
    8979 
    90801; # Magic true value required at end of module 
     
    151141=item * new( [LOCALE] ) 
    152142 
     143Old interface (Backward compatible). 
    153144Return the Geo::Direction::Name object. 
    154145LOCALE is optional, default is "en_US". 
     146 
     147=item * new( [OPTION] ) 
     148 
     149New interface. 
     150OPTION is hash reference, could be set two values. 
     151Default specification is used. 
     152 
     153=over 8 
     154 
     155=item * spec 
     156 
     157Set original spec name if want. 
     158If not set, use default specification. 
     159 
     160=item * locale 
     161 
     162Set locale. 
     163 
     164=back 
    155165 
    156166=back 
     
    179189Default is 8. 
    180190 
     191After version 0.0.4, you can set other deviding number by using non-default specification. 
     192 
     193 
    181194=back 
    182195 
     
    191204 
    192205=over 4 
     206 
     207=item * spec 
    193208 
    194209=item * locale