NAME
    POEx::Weather::OpenWeatherMap - POE-enabled OpenWeatherMap client

SYNOPSIS
      use POE;
      use POEx::Weather::OpenWeatherMap;

      # An API key can be obtained (free) at http://www.openweathermap.org:
      my $api_key = 'foo';

      POE::Session->create(
        package_states => [
          main => [qw/
            _start
        
            pwx_error
            pwx_weather
            pwx_forecast
          /],
        ],
      );

      sub _start {
        my ($kernel, $heap) = @_[KERNEL, HEAP];
    
        # Create, store, and start emitter:
        my $wx = POEx::Weather::OpenWeatherMap->new(
          api_key      => $api_key,
          event_prefix => 'pwx_',
        );

        $heap->{wx} = $wx;
        $wx->start;

        ## An example request:
        $wx->get_weather(
          location => 'Manchester, NH',
          tag      => 'mytag',
        );
      }

      sub pwx_error {
        my $err = $_[ARG0];
        my $status  = $err->status;
        my $request = $err->request;
        # ... do something with error ...
        warn "Error! ($status)";
      }

      sub pwx_weather {
        my $result = $_[ARG0];

        my $tag = $result->request->tag;

        my $place = $result->name;

        my $tempf = $result->temp_f;
        my $conditions = $result->conditions_verbose;
        # (see Weather::OpenWeatherMap::Result::Current for a method list)
        # ...
      }

      sub pwx_forecast {
        my $result = $_[ARG0];

        my $place = $result->name;

        my $itr = $result->iter;
        while (my $day = $itr->()) {
          my $date = $day->dt->mdy;
          my $temp_hi = $day->temp_max_f;
          my $temp_lo = $day->temp_min_f;
          # (see Weather::OpenWeatherMap::Result::Forecast)
          # ...
        }
      }

      POE::Kernel->run;

DESCRIPTION
    A POE-enabled interface to OpenWeatherMap
    (<http://www.openweathermap.org>), providing an object-oriented
    asynchronous interface to current & forecast weather conditions for a
    given city, latitude/longitude, or OpenWeatherMap city code.

    This is really just an asynchronous counterpart to
    Weather::OpenWeatherMap; look there for documentation regarding Request
    & Result objects.

    This an event emitter that consumes MooX::Role::POE::Emitter; look there
    for documentation on composed methods. See
    <http://www.openweathermap.org> for more on OpenWeatherMap itself.

  ATTRIBUTES
   api_key
    Your OpenWeatherMap <http://www.openweathermap.org> API key.

    (See <http://www.openweathermap.org/api> to register for free.)

  METHODS
   start
    Start our session.

    Must be called before events will be received or emitted.

   stop
    Stop our session, shutting down the emitter and user agent (which will
    cancel pending requests).

   get_weather
      $wx->get_weather(
        # 'location =>' is mandatory.
        #  These are all valid location strings:
        #  By name:
        #   'Manchester, NH'
        #   'London, UK'
        #  By OpenWeatherMap city code:
        #   5089178
        #  By latitude/longitude:
        #   'lat 42, long -71'
        location => 'Manchester, NH',

        # Set 'forecast => 1' to get the forecast,
        # omit or set to false for current weather:
        forecast => 1,

        # If 'forecast' is true, you can specify the number of days to fetch
        # (up to 14):
        days => 3,

        # Optional tag for identifying the response to this request:
        tag  => 'foo',
      );

    Request a weather report for the given "location =>".

    The location can be a 'City, State' or 'City, Country' string, an
    OpenWeatherMap <http://www.openweathermap.org/> city code, or a 'lat X,
    long Y' string.

    Requests the current weather by default (see
    Weather::OpenWeatherMap::Request::Current).

    If passed "forecast => 1", requests a weather forecast (see
    Weather::OpenWeatherMap::Request::Forecast), in which case "days =>
    $count" can be specified (up to 14).

    An optional "tag =>" can be specified to identify the response when it
    comes in.

    Any extra arguments are passed to the constructor for the appropriate
    Request subclass; see Weather::OpenWeatherMap::Request.

    The request is made asynchronously and a response (or error) emitted
    when it is available; see "EMITTED EVENTS". There is no useful return
    value.

  RECEIVED EVENTS
   get_weather
      $poe_kernel->post( $wx->session_id =>
        get_weather =>
          location => 'Manchester, NH',
          tag      => 'foo',
      );

    POE interface to the "get_weather" method; see "METHODS" for available
    options.

  EMITTED EVENTS
   error
    Emitted when an error occurs; this may be an internal error, an HTTP
    error, or an error reported by the OpenWeatherMap API.

    $_[ARG0] is a Weather::OpenWeatherMap::Error object.

   weather
    Emitted when a request for the current weather has been successfully
    processed.

    $_[ARG0] is a Weather::OpenWeatherMap::Result::Current object; see that
    module's documentation for details on retrieving weather information.

   forecast
    Emitted when a request for a weather forecast has been successfully
    processed.

    $_[ARG0] is a Weather::OpenWeatherMap::Result::Forecast object; see that
    module's documentation for details on retrieving per-day forecasts
    (Weather::OpenWeatherMap::Result::Forecast::Day objects).

SEE ALSO
    Weather::OpenWeatherMap

    Weather::OpenWeatherMap::Error

    Weather::OpenWeatherMap::Result

    Weather::OpenWeatherMap::Result::Current

    Weather::OpenWeatherMap::Result::Forecast

    Weather::OpenWeatherMap::Request

    Weather::OpenWeatherMap::Request::Current

    Weather::OpenWeatherMap::Request::Forecast

    The "examples/" directory of this distribution.

AUTHOR
    Jon Portnoy <avenj@cobaltirc.org>