package PerlWordCount::WordCount;
#-----------------------------------------------------------------------

# Utworzenie obiektu 'PerlWordCount::WordCount', 
# możliwe jest także ustawienie właściwości 'Text'

=for interface
     [interface: pure]
     static WordCount WordCount();
     static WordCount WordCount(str text);
=cut

sub new {
    my ($package,$text) = @_;
    my $self = bless {} => $package;
    $self->Text($text);
    return $self;
}
#-----------------------------------------------------------------------

# Uzyskanie lub ustawienie właściwości 'Text' oraz aktualizacja liczników słów

=for interface
     str Text;
=cut

sub Text {
    my ($self,$text) = @_;
    return $self->{Text} unless defined $text;

    $self->{Text} = $text;
    $self->{Count} = {};

    # Konwersja wszystkich znaków nie będących literami do pojedynczej spacji
    $text =~ tr/a-zA-Z/ /cs;

    # Podział tekstu w miejscu wystąpienia spacji i policzenie słów
    ++$self->{Count}->{$_} foreach split(' ', lc $text);
}
#-----------------------------------------------------------------------

# 'Count' zwraca liczbę wystąpień lub zgłasza wyjątek

=for interface
     int Count();
     int Count(str word);
=cut

sub Count {
    my ($self,$word) = @_;

    # Metoda 'Count' bez argumentów zwraca liczbę poszczególnych słów
    return int keys %{$self->{Count}} unless defined $word;

    # Zgłoszenie wyjątku, jeśli $word nie występuje w 'Text'
    die "Nie odnaleziono słowa '$word'" unless defined $self->{Count}->{$word};

    # Zwrócenie liczby wystąpień
    return $self->{Count}->{$word};
}
#-----------------------------------------------------------------------

# 'Words' zwraca posortowaną alfabetycznie *listę* wszystkich słów w 'Text'

=for interface
     wantarray! str[] Words();
=cut

sub Words {
    my ($self) = @_;
    return sort keys %{$self->{Count}};
}

1;
