// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_SCHEDULER_CHILD_CANCELABLE_CLOSURE_HOLDER_H_
#define COMPONENTS_SCHEDULER_CHILD_CANCELABLE_CLOSURE_HOLDER_H_

#include "base/cancelable_callback.h"

namespace scheduler {

// A CancelableClosureHolder is a CancelableCallback which resets its wrapped
// callback with a cached closure whenever it is canceled.
class CancelableClosureHolder {
 public:
  CancelableClosureHolder();
  ~CancelableClosureHolder();

  // Resets the closure to be wrapped by the cancelable callback.  Cancels any
  // outstanding callbacks.
  void Reset(const base::Closure& callback);

  // Cancels any outstanding closures returned by callback().
  void Cancel();

  // Returns a callback that will be disabled by calling Cancel(). Callback
  // must have been set using Reset() before calling this function.
  const base::Closure& callback() const;

 private:
  base::Closure callback_;
  base::CancelableClosure cancelable_callback_;

  DISALLOW_COPY_AND_ASSIGN(CancelableClosureHolder);
};

}  // namespace scheduler

#endif  // COMPONENTS_SCHEDULER_CHILD_CANCELABLE_CLOSURE_HOLDER_H_
