I think this can be implemented as just:

```c++
inline bool IsEmpty() const {
  return NanNew(handle)->Get(NanSymbol("callback"))->IsUndefined();
}
```

TBD if it should have a HandleScope.  With the snippet above, the rematerialized handle leaks into the caller's scope.

Apropos the Get(), we can avoid string creation for every lookup by using numerical indices, like this:

```c++
static const uint32_t kCallbackIndex = 0;
// ...
NanNew(handle)->Set(kCallbackIndex, callback);
// ...
bool empty = NanNew(handle)->Get(kCallbackIndex)->IsUndefined();
// etc.
```

Final observation: I wouldn't mind getting rid of NanSymbol() altogether.  People frequently misuse symbols and it's going to be confusing when ES6 goes mainstream because ES6 has, well, symbols.

I investigated the performance characteristics of symbols when I did the multi-context stuff and they're nearly always a net loss.  Hashing the string and looking it up in the symbol table is on average always more expensive than just copying the string to the new space.  (Especially with String::NewFromOneByte() as it doesn't decode the bytes.)